package org.ww.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.ww.bean.Car;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@ComponentScan("org.ww.bean")
@Configuration
public class MainConfigBeanLifeCycle {

    /**
     * bean生命周期：
     *  创建---初始化---销毁
     * 1  注解initMethod  destroyMethod
     * 单实例
     *      创建：ioc容器创建的时候就会进行实例化
     *      初始化：对象创建完成后，并赋值好，进行初始化
     *      销毁：容器关闭的时候，实例就会被销毁
     * 多实例：
     *      创建：获取的时候才会进行实例的创建
     *      初始化：对象创建完成后，并赋值好，进行初始化
     *      销毁：容器不会管理这个bean，容器不会调用销毁方法
     * 2 实现接口方式
     *      InitializingBean--初始化
     *      DisposableBean--销毁
     * 3 使用JSR250
     *   @PostConstruct：在bean创建完成并进行赋值后进行初始化
     *   @PreDestroy：在容器销毁bean之前通知我们进行清理工作
     * 4 BeanPostProcessor  bean的后置处理器
     *    postProcessBeforeInitialization:在初始化之前执行
     *    postProcessAfterInitialization:在初始化之后执行
     *
     * @return
     *
     *
     * spring中底层对BeanPostProcessor的使用
     *
     */

//    @Scope("prototype")
    @Bean(initMethod = "init",destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}
